﻿#ifndef IIC_H
#define IIC_H

#include "tlv.h"

enum IIC_STATUS {
    IIC_STATUS_NULL,

    IIC_STATUS_BUSY, // IICA0 busy 状态,mcu做主时,通讯中调用收\发时会出现

    IIC_STATUS_RESTART, // re_start

    IIC_STATUS_END_RECEIVE, // 主机写,mcu接收完成
    IIC_STATUS_END_SEND,    // 主机读,mcu发送完成;mcu为主机时,代表写完成

    IIC_STATUS_ERR_ADDRFAULT, // 地址不匹配

    IIC_STATUS_ERR_MASTER_NCK,   // NCK,主机拒绝下一个字节的收发或已掉线;mcu为主机时,收到一个nck
    IIC_STATUS_ERR_MASTER_READ,  // 主机读,没有提供数据(mcu写)
    IIC_STATUS_ERR_MASTER_WRITE, // 主机写,没有提供buffer(mcu读)

    IIC_STATUS_ERR_MASTER_WRITE_OVERFLOW, // 主机写,超出cap;mcu为主机时,代表没写完
    IIC_STATUS_ERR_MASTER_READ_OVERFLOW,   // 主机读,超出len
};

class IIC : public Tlv
{
public:
    // IIC响应结果的构造函数
    explicit IIC(const IIC_STATUS& status=IIC_STATUS::IIC_STATUS_NULL, const QByteArray& data=QByteArray());

    // IIC请求的构造函数
    explicit IIC(uint8_t addr, const QByteArray& data, uint16_t readLen);

    uint8_t busID() const;
    uint8_t slave() const;
    uint16_t readLen() const;
    IIC_STATUS status() const;
    QByteArray data() const;
    QString toLog() const override;
    bool isNull() const;

    static IIC fromTlv(const Tlv& tlv);
    static QString statusStr(const IIC_STATUS& status);
    static IIC iicNull();

protected:
    static QByteArray iicRes2bytes(uint8_t bus, const IIC_STATUS& status, const QByteArray& data);
    static QByteArray iicReq2bytes(uint8_t bus, uint8_t addr, const QByteArray& data, uint16_t readLen);

private:
    IIC_STATUS m_status;
    QByteArray m_data;

};

Q_DECLARE_METATYPE(IIC)

#endif // IIC_H
